package day13;

// 跳石板
// 使用动归解决，还需要对每一级台阶进行约束存储
// 从n跳到m的最小次数

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main5 {
    // 求约数:不含1和本身K
    private static List<Integer> div(int k) {
        List<Integer> number = new ArrayList<>();
        for (int i = 2; i <= (int) Math.sqrt(k); i++) {
            if (k % i == 0) {
                // 两个约数都需要！
                number.add(i);
                if (i != k/i) {
                    number.add(k/i);
                }
            }
        }
        return number;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();

        // steps[i]表示到到达第i级需要跳的次数！！！
        // 首先全部赋值为最大值，表示不可达
        int[] steps = new int[m+1];
        for (int i = 0; i < m+1; i++) {
            steps[i] = Integer.MAX_VALUE;
        }

        // 然后先将所在的台阶可以跳的次数/约束置0，也就是直接到达
        steps[n] = 0;
        // 开始从第n个台阶遍历，并计算每个台阶的约数
        for (int i = n; i < m; i++) { // 目标台阶不用进行步数统计，因为用不到
            if(steps[i] == Integer.MAX_VALUE) { // 表示该级台阶不可达
                continue;
            }
            // 求i的约数：使用链表进行存储，也就是在该级台阶上可以跳的台阶数
            List<Integer> number = div(i);
            // 遍历该约数链表，进行下一步走位的判断
            for (int j : number) {
                // j表示在该台阶上可以继续走多少个台阶
                // 这里的判断以及条件改变很重要！
                // 到新的台阶上的值要进行更新！
                if(i+j<=m  && steps[i+j]!=Integer.MAX_VALUE) { // 可以直达
                    steps[i+j] = Math.min(steps[i+j],steps[i]+1);
                } else if(i+j<=m) { // 不可以直达，要目前台阶开始跳
                    steps[i+j] = steps[i]+1;
                }
            }
        }
        if (steps[m] == Integer.MAX_VALUE) {
            System.out.println(-1);
        } else {
            System.out.println(steps[m]);
        }
    }
}
